#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <limits.h>

#define precisaoPI 100000000  //Numero de pontos que serao utilizados na estimacao de PI

const unsigned int aleatorio1 = 1664525, aleatorio2 = 1013904223;


typedef struct //Estrutura que salva o numero de pontos dentro do quadrado e dentro do ciruculo
{
    double pontosCirculo;
    double pontosQuadrado;
} pontoStruct;

pontoStruct nPontos; //vetor da estrutura que guarda o numero de pontos




unsigned int funcaoRandomica(unsigned int x)
{
    return x*aleatorio1+aleatorio2;
}

void adicionaPontos()
{

    int i;
    double x1;
    double y1;
    unsigned int x = time(NULL);


    for (i = 0; i < precisaoPI; i++)  //Adiciona os pontos no quadrado e no circulo
    {

        x = funcaoRandomica(x); //Encontra um numero aleatorio para x e y entre 0 e 1
        x1 = (double)x/UINT_MAX;
        x = funcaoRandomica(x);
        y1 = (double)x/UINT_MAX;

        if((x1*x1) + (y1*y1) <= 1)  //Verifica se o ponto esta dentro do circulo
        {
            nPontos.pontosCirculo++; //Incrementa o contador de pontos do circulo
        }
        nPontos.pontosQuadrado++; //Incrementa o contador de pontos do quadrado

    }

}


int main (int argc, char *argv[])
{

    double valorPi = 0; //valor final de PI
    nPontos.pontosCirculo = 0; //Inicializa os contadores de pontos da estrutura
    nPontos.pontosQuadrado = 0;

    srand(time(NULL)); //Inicializa a funcao randomica

    adicionaPontos();//Chama a funcao que adiciona pontos no quadrado e no circulo

    //Calcula o valor do PI, multiplicando os pontos do circulo por 4 e dividindo tudo pelos pontos do quadrado
    valorPi = (4*nPontos.pontosCirculo)/(nPontos.pontosQuadrado);

    printf("%.6lf\n", valorPi);//Imprime o valor de PI com 6 casas decimais

    return 0;
}
